package cn.zzz.openplatform.amap.model.geocode;

import cn.hutool.core.annotation.Alias;
import cn.zzz.openplatform.amap.model.AmapOpenApiResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 逆地理编码响应结果
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class AmapReverseGeoCodeResponse extends AmapOpenApiResponse {
    /**
     * 逆地理编码数据
     */
    private Regeocode regeocode;

    @Data
    public static class Regeocode {
        /**
         * 地址组件
         */
        private AddressComponent addressComponent;

        /**
         * 道路信息列表
         */
        private List<Road> roads;

        /**
         * 道路交叉口列表
         */
        private List<RoadInter> roadinters;

        /**
         * POI信息列表
         */
        private List<Poi> pois;

        /**
         * AOI信息列表
         */
        private List<Aoi> aois;
    }

    /**
     * 逆地理编码内部数据结构
     * 对应高德开放平台逆地理编码API的返回数据结构
     *
     * @see <a href="https://lbs.amap.com/api/webservice/guide/api/georegeo">高德逆地理编码文档</a>
     */
    @Data
    public static class AddressComponent {
        /**
         * 国家名称
         * 示例：中国
         */
        private String country;

        /**
         * 省份名称
         * 示例：北京市
         */
        private String province;

        /**
         * 城市名称
         * 示例：北京市
         * 注意：直辖市返回空
         */
        private String city;

        /**
         * 区县名称
         * 示例：海淀区
         */
        private String district;

        /**
         * 乡镇街道
         * 示例：燕园街道
         */
        private String township;

        /**
         * 乡镇街道编码
         * 示例：110101001000
         */
        private String towncode;

        /**
         * 城市区号
         * 示例：010
         */
        private String citycode;

        /**
         * 行政区编码
         * 示例：110108
         */
        private String adcode;

        /**
         * 社区信息列表
         *
         * @see Neighborhood
         */
        private List<Neighborhood> neighborhood;

        /**
         * 建筑信息列表
         *
         * @see Building
         */
        private List<Building> building;

        /**
         * 门牌信息
         *
         * @see StreetNumber
         */
        private StreetNumber streetNumber;

        /**
         * 所属海域信息
         * 示例：渤海
         */
        private String seaArea;

        /**
         * 商圈信息列表
         * 示例：颐和园
         */
        private List<BusinessArea> businessAreas;
    }


    @Data
    public static class Neighborhood {
        /**
         * 社区名称
         * 示例：北京大学
         */
        private String name;

        /**
         * POI类型
         * 示例：科教文化服务;学校;高等院校
         */
        private String type;
    }

    @Data
    public static class Building {
        /**
         * 建筑名称
         * 示例：万达广场
         */
        private String name;

        /**
         * 类型分类
         * 示例：科教文化服务;学校;高等院校
         */
        private String type;
    }

    @Data
    public static class StreetNumber {
        /**
         * 街道名称
         * 示例：中关村北二条
         */
        private String street;

        /**
         * 门牌号
         * 示例：3号
         */
        private String number;

        /**
         * 坐标点
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;

        /**
         * 方位
         * 示例：北
         */
        private String direction;

        /**
         * 距离
         * 单位：米
         * 示例：50
         */
        private String distance;
    }

    @Data
    public static class BusinessArea {
        /**
         * 商圈信息
         *
         * @see #name
         * @see #location
         * @see #id
         */
        private String businessArea;

        /**
         * 中心点坐标
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;

        /**
         * 商圈名称
         * 示例：颐和园
         */
        private String name;

        /**
         * 所在区域adcode
         * 示例：朝阳区/海淀区
         */
        private String id;
    }

    @Data
    public static class Road {
        /**
         * 道路ID
         * 示例：123456
         */
        private String id;

        /**
         * 道路名称
         * 示例：阜通东大街
         */
        private String name;

        /**
         * 距离
         * 单位：米
         * 示例：100
         */
        private String distance;

        /**
         * 方位
         * 示例：南
         */
        private String direction;

        /**
         * 坐标点
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;
    }

    @Data
    public static class RoadInter {
        /**
         * 距离
         * 单位：米
         * 示例：50
         */
        private String distance;

        /**
         * 方位
         * 示例：东南
         */
        private String direction;

        /**
         * 路口坐标
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;

        /**
         * 第一条道路ID
         * 示例：123456
         */
        @Alias("first_id")
        private String firstId;

        /**
         * 第一条道路名称
         * 示例：阜通东大街
         */
        @Alias("first_name")
        private String firstName;

        /**
         * 第二条道路ID
         * 示例：789012
         */
        @Alias("second_id")
        private String secondId;

        /**
         * 第二条道路名称
         * 示例：北辰西路
         */
        @Alias("second_name")
        private String secondName;
    }

    @Data
    public static class Poi {
        /**
         * POI ID
         * 示例：B000A8081D
         */
        private String id;

        /**
         * 名称
         * 示例：北京大学
         */
        private String name;

        /**
         * 类型
         * 示例：科教文化服务;学校;高等院校
         */
        private String type;

        /**
         * 电话
         * 示例：010-62755001
         */
        private String tel;

        /**
         * 距离
         * 单位：米
         * 示例：200
         */
        private String distance;

        /**
         * 方向
         * 示例：西北
         */
        private String direction;

        /**
         * 地址
         * 示例：北京市海淀区颐和园路5号
         */
        private String address;

        /**
         * 坐标点
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;

        /**
         * 所在商圈
         * 示例：中关村
         */
        private String businessarea;
    }

    @Data
    public static class Aoi {
        /**
         * AOI ID
         * 示例：123456789
         */
        private String id;

        /**
         * 名称
         * 示例：北京大学
         */
        private String name;

        /**
         * 所在区域编码
         * 示例：110108
         */
        private String adcode;

        /**
         * 中心点坐标
         * 格式：经度,纬度
         * 示例：116.397428,39.90923
         */
        private String location;

        /**
         * 面积
         * 单位：平方米
         * 示例：2000000
         */
        private String area;

        /**
         * 距离
         * 单位：米
         * 示例：0（表示在AOI面内）
         */
        private String distance;

        /**
         * 类型
         * 示例：教育科研
         */
        private String type;
    }
}
